package laberinto;

import fabricas.FabricaTiempo;
import utilidades.Constantes;
import utilidades.ContadorDeCiclos;
import utilidades.Vector;
import interfaces.IObjetoComible;
import interfaces.IPacman;

public class Fruta implements IObjetoComible{
	
	private Vector direccionActual;
	private Casilla casillaActual;
	private Casilla casillaInicial;
	private ContadorDeCiclos contadorParaMoverse;
	private ContadorDeCiclos contadorParaAparecer;
	private boolean comido;
	
	public Fruta(Casilla casillaInicial){
		this.contadorParaMoverse = FabricaTiempo.crearContadorDeCiclos(Constantes.CICLOS_PARA_MOVERSE);
		this.contadorParaAparecer= FabricaTiempo.crearContadorDeCiclos(Constantes.CICLOS_PARA_MOSTRAR_FRUTA);
		this.casillaActual = casillaInicial;
		this.casillaInicial = casillaInicial;
		this.casillaActual.agregarContenido(this);
		this.comido = false;
		this.direccionActual = Constantes.ARRIBA;
	}
	
	public void vivir(){
		if (!comido){
			mover();
		}else{
			mostrarFruta();
		}
	}
	
	public void mostrarFruta(){
		if (seMuestra()){
			casillaActual = casillaInicial;
			casillaActual.agregarContenido(this);
			comido = false;
		}
	}
	
	private boolean seMuestra(){
		if(contadorParaAparecer.ocurreEnEsteCiclo(Constantes.VELOCIDAD_FRUTA)){
			return true;
		}
		return false;
	}

	public void mover(){
		if (seMueve()){
			direccionActual = casillaActual.obtenerDireccionAlAzar(direccionActual.obtenerVectorContrario());
			moverACasilla(casillaActual.obtenerDestino(direccionActual));
		}
	}
	
	private boolean seMueve(){
		if(contadorParaMoverse.ocurreEnEsteCiclo(Constantes.VELOCIDAD_FRUTA)){
			return true;
		}
		return false;
	}
	
	private void moverACasilla(Casilla nuevaCasilla){
		casillaActual.sacarContenido(this);
		casillaActual = nuevaCasilla;
		casillaActual.agregarContenido(this);		
	}
	
	@Override
	public void interactuarCon(IPacman pacman) {
		if(!comido){
			casillaActual.sacarContenido(this);
			vista.Audio.reproducirSonido(Constantes.CLIP_PACMAN_COME_FRUTA);
			pacman.incrementarPuntaje(100);
			contadorParaAparecer.resetearContador();
			comido = true;
		}
	}

	@Override
	public String converitEnString() {
		return "Fruta";
	}

	public Vector obtenerPosicion() {
		return casillaActual.obtenerPosicion();
	}

	public boolean fueComido() {
		return comido;
	}
}